package cn.pdx.elec.service.impl;



import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.pdx.elec.dao.ElecSystemDDlDao;
import cn.pdx.elec.domain.ElecSystemDDl;
import cn.pdx.elec.service.ElecSystemDDlService;
import cn.pdx.elec.web.form.ElecSystemDDlForm;



/**
 *  @Repository 、@Service 和 @Controller 
           在目前的 Spring 版本中，这 3 个注释和 @Component 是等效的，但是从注释类的命名上，3 个注释分别和持久层 、业务层 和控制层 相对应。
 * 
 *@Transactional(readOnly=true),定义类方法的事务为只读,不能写入数据库
 * 业务类方法只有增、删、改为可写,其他事务都为只读
 * @author 彭定旭
 */

@Transactional(readOnly=true)
@Service(ElecSystemDDlService.SERVICE_NAME)
public class ElecSystemDDlServiceImpl implements ElecSystemDDlService {
   
	
	//业务层调用dao层;用注解,把相应的dao注入进去
	@Resource(name=ElecSystemDDlDao.SERVICE_NAME)
	private ElecSystemDDlDao elecSystemDDlDao;

	
	/**
	 * @Name:findKeyWord
	 * @Description:查询数据类型列表，去掉重复
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-3-30(创建日期)
	 * @parameters:无
	 * @return:List<ElecSystemDDlForm>数据类型列表的VO对象
	 */
	public List<ElecSystemDDlForm> findKeyWord() {
		
		//返回的是数组
		List<Object> list=elecSystemDDlDao.findKeyWord();
		
		List<ElecSystemDDlForm> formList=this.elecSystemDDlDaoObejctToVO(list);
		
		return formList;
	}
    
	

	/**
	 * @Name:elecSystemDDlDaoObejctToVO
	 * @Description:Object对象转换为VO对象
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-3-30(创建日期)
	 * @parameters:
	 * @return:List<ElecSystemDDlForm>VO对象
	 */
	private List<ElecSystemDDlForm> elecSystemDDlDaoObejctToVO(List<Object> list) {
		
		
		ElecSystemDDlForm elecSystemDDlForm=null;
		
		List<ElecSystemDDlForm> formList=new ArrayList<ElecSystemDDlForm>();
		
		for(int i=0;list!=null && i<list.size();i++)
		{
			Object object=list.get(i);
			
			elecSystemDDlForm=new ElecSystemDDlForm();
			
			elecSystemDDlForm.setKeyword(object.toString());
			
			formList.add(elecSystemDDlForm);
			
		}
		return formList;
	}


 
	/**
	 * @Name:findElecSystemDDlListByKeyword
	 * @Description:根据选中的数据类型查询选中的数据项
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-4-1(创建日期)
	 * @parameters:String keyword
	 * @return:数据项集合List<ElecSystemDDlForm> VO
	 */
	public List<ElecSystemDDlForm> findElecSystemDDlListByKeyword(String keyword) {
		
		
		//封装一下代码,下面好重用
		List<ElecSystemDDl> list=this.findSystemDDlByCondition(keyword);
		
		//PO对象转换成VO对象
		List<ElecSystemDDlForm> formList=this.elecSystemDDlPOListToVOList(list);
		
		return formList;
	}


	
	/**
	 * @Name:findSystemDDlByCondition
	 * @Description:根据选中的数据类型查询选中的数据项,封装起来的方法,好重用
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-4-2(创建日期)
	 * @parameters:String keyword
	 * @return:数据项集合List<ElecSystemDDlForm> VO
	 */
	private List<ElecSystemDDl> findSystemDDlByCondition(String keyword) {
		

          String hqlWhere="and o.keyword=?";
		
		  Object [] params={keyword};
		
		  LinkedHashMap<String, String> orderby=new LinkedHashMap<String, String>();
		
		  orderby.put("o.ddlCode", "asc");
		
		  List<ElecSystemDDl> list=elecSystemDDlDao.findCollectionByConditionNoPage(hqlWhere, params, orderby);
		  
		  return list;
	}


	



	/**
	 * @Name:elecSystemDDlPOListToVOList
	 * @Description:PO -> VO
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-4-1(创建日期)
	 * @parameters:List<ElecSystemDDl> list 集合
	 * @return:数据项集合List<ElecSystemDDlForm> VO
	 */
	private List<ElecSystemDDlForm> elecSystemDDlPOListToVOList(
			List<ElecSystemDDl> list) {
		
		ElecSystemDDlForm elecSystemDDlForm=null;
		
		List<ElecSystemDDlForm> formList=new ArrayList<ElecSystemDDlForm>();
		
		for(int i=0;list!=null&& i<list.size();i++)
		{
			ElecSystemDDl elecSystemDDl=list.get(i);
			
			elecSystemDDlForm=new ElecSystemDDlForm();
			elecSystemDDlForm.setSeqID(String.valueOf(elecSystemDDl.getSeqID()));
			elecSystemDDlForm.setKeyword(elecSystemDDl.getKeyword());
			elecSystemDDlForm.setDdlCode(String.valueOf(elecSystemDDl.getDdlCode()));
			elecSystemDDlForm.setDdlName(elecSystemDDl.getDdlName());
			formList.add(elecSystemDDlForm);
		}
		return formList;
	}



	/**
	 * @Name:saveElecSystemDDl
	 * @Description:保存数据字典，保存时包括数据类型、数据编号、数据项名称
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-4-2(创建日期)
	 * @parameters:ElecSystemDDlForm elecSystemDDlForm 页面传递的表单
	 * @return:无
	 */
	@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
	public void saveElecSystemDDl(ElecSystemDDlForm elecSystemDDlForm) {
		
		//获取页面传递的表单
		//获取数据类型
		String keyword=elecSystemDDlForm.getKeywordname();
		
		//获取判断标志
		String typeflag=elecSystemDDlForm.getTypeflag();
		
		//获取需要保存的数据项的名称
		String []itemname=elecSystemDDlForm.getItemname();
		
		//如果是新增数据类型的操作,此时typeflag==new
		if(typeflag!=null && typeflag.equals("new"))
		{  
			
			//抽一个方法出来,保存数据字典
			this.saveSystemDDlWithParams(keyword,itemname);
			
			/** for(int i=0;itemname!=null && i<itemname.length;i++)
			{
				//放入PO对象
				ElecSystemDDl elecSystemDDl=new ElecSystemDDl();
				
				elecSystemDDl.setKeyword(keyword);
				elecSystemDDl.setDdlName(itemname[i]);
				elecSystemDDl.setDdlCode(new Integer(i+1));
				elecSystemDDlDao.save(elecSystemDDl);
			}*/
			
		}
		//否则在原有的数据类型中进行修改和编辑,此时typeflag==add
		else {
			
			/**
			 * 先获取根据选中的数据类型查询出列表,在删除，然后在插入新的数据
			 */
			
			//获取根据选中的数据类型查询出列表
			List<ElecSystemDDl> list=findSystemDDlByCondition(keyword);
			
			//调用底层方法删除列表
			elecSystemDDlDao.deleteObjectByCollection(list);
			
			//保存数据字典,调用方法
			this.saveSystemDDlWithParams(keyword,itemname);
		}
	}


  
	/**
	 * @Name:saveSystemDDlWithParams
	 * @Description:保存数据字典，通过参数
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-4-2(创建日期)
	 * @parameters:String keyword, String[] itemname
	 * @return:无
	 */
	
	private void saveSystemDDlWithParams(String keyword, String[] itemname) {
        
		/**
		 * 改进代码
		 * 把那个ElecSystemDDl放入list中;最后在保存,免得循环里要执行多个save方法
		 */
		List<ElecSystemDDl> list=new ArrayList<ElecSystemDDl>();
		
		for(int i=0;itemname!=null && i<itemname.length;i++)
		{
			//放入PO对象
			ElecSystemDDl elecSystemDDl=new ElecSystemDDl();
			
			elecSystemDDl.setKeyword(keyword);
			elecSystemDDl.setDdlName(itemname[i]);
			elecSystemDDl.setDdlCode(new Integer(i+1));
			list.add(elecSystemDDl);
			//elecSystemDDlDao.save(elecSystemDDl);
		}
		
		/**
		 * 调用底层方法通过一个list集合保存对象
		 */
		elecSystemDDlDao.saveObjectByCollection(list);
	}
   
	

	
	
	
	
	
}
